package helper

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"github.com/golang-jwt/jwt/v4"
	uuid "github.com/satori/go.uuid"
	"time"
)

// 声明自己的 key
var myKey = []byte("zero-cloud-disk-ycc")

type UserClaims struct {
	// 内嵌标准的声明
	Id int `json:"id"`
	// Identity 用户唯一标识
	Identity string `json:"identity"`
	Name     string `json:"name"`
	jwt.RegisteredClaims
}

// GetUUID 生成 uuid
func GetUUID() string {
	return uuid.NewV4().String()
}

// GetMd5 MD5大写加密
func GetMd5(s string) string {
	m := md5.New()
	m.Write([]byte(s))
	encode := hex.EncodeToString(m.Sum(nil))
	return encode
}

// GenUserToken
// 生成 token
func GenUserToken(id int, identity, name string) (string, error) {
	// 创建一个我们自己声明的数据
	userClaim := UserClaims{
		id,
		identity,
		name,
		jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)), // 定义到期时间
			Issuer:    "ycc",
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, userClaim)
	tokenString, err := token.SignedString(myKey)
	if err != nil {
		return "", err
	}
	return tokenString, err
}

// ParseToken
// 解析 token
func ParseToken(tokenString string) (*UserClaims, error) {
	// 解析 token
	userClaim := new(UserClaims)
	token, err := jwt.ParseWithClaims(tokenString, userClaim, func(token *jwt.Token) (interface{}, error) {
		return myKey, nil
	})

	if err != nil {
		return nil, err
	}
	if !token.Valid {
		return nil, fmt.Errorf("parse Token Error: %v", err)
	}

	return userClaim, nil
}
